home *** CD-ROM | disk | FTP | other *** search
- unit BigStuff;
- interface
- uses
- Objects,
- WinAPI;
-
- type
- PBigData = ^TBigData;
- TBigData = object(TObject)
- NumRecs: Longint;
- RecSize: Word;
- Start: Word;
- constructor Init(ANumRecs: Longint; ARecSize: Word);
- destructor Done; virtual;
- procedure GetSetData(Index: Longint; var Data; SetData: Boolean);
- virtual;
- end;
- implementation
-
- constructor TBigData.Init(ANumRecs: Longint; ARecSize: Word);
- begin
- TObject.Init;
- NumRecs := ANumRecs;
- RecSize := ARecSize;
- while 65536 mod RecSize <> 0 do Inc(RecSize);
- Start := GlobalAlloc(gmem_Moveable, RecSize * NumRecs);
- if Start = 0 then
- Runerror(201);
- end;
-
- destructor TBigData.Done;
- begin
- TObject.Done;
- GlobalFree(Start);
- end;
-
- procedure TBigData.GetSetData(Index: Longint; var Data; SetData: Boolean);
- var
- Selector, Offset: Word;
- P: Pointer;
- begin
- if Index >= NumRecs then
- begin
- RunError(201);
- end;
- Index := Index * RecSize;
- Selector := (Index div 65536) * SelectorInc + Start;
- OffSet := Index mod 65536;
- P := GlobalLock(Selector);
- P := Ptr(Selector, Offset);
- if SetData then
- Move(Data, P^, RecSize)
- else
- Move(P^, Data, RecSize);
- GlobalUnlock(Selector);
- end;
-
- type
- PBigInt = ^TBigInt;
- TBigInt = object(TBigData)
- constructor Init(ANumRecs: Longint);
- procedure PutItem(Index: Longint; Value: Integer);
- function GetItem(Index: Longint): Integer;
- end;
-
- constructor TBigInt.Init(ANumRecs: Longint);
- begin
- TBigData.Init(ANumRecs, SizeOf(Integer));
- end;
-
- procedure TBigInt.PutItem(Index: Longint; Value: Integer);
- begin
- TBigData.GetSetData(Index, Value, True);
- end;
-
- function TBigInt.GetItem(Index: Longint): Integer;
- var
- Value: Integer;
- begin
- TBigData.GetSetData(Index, Value, False);
- GetItem := Value;
- end;
-
- var
- BI: TBigInt;
- begin
- BI.Init(200000);
- BI.PutItem(100000, 777);
- Writeln(BI.GetItem(100000));
- BI.Done;
- end.